/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tictactoeonline;

import abiturklassen.netzklassen.Server;
import java.util.ArrayList;

/**
 * Die Klasse fuer den Server.
 * @author Daniel Mueller, Phillip Hertel, Jonas Hauff
 */
public class Spielserver extends Server {
    private ArrayList<User> user;
    private ArrayList<User> warteschlange;
    private laufenderServer server;
    
    public Spielserver(int pPort, laufenderServer pServer)
    {
        super(pPort);
        server = pServer;
        user = new ArrayList();
        warteschlange = new ArrayList();
        pServer.setLabelPort(Integer.toString(pPort));
        pServer.protokoll("Server mit Port "+pPort+" wurde erstellt");
    }
    /**
     * Die einkommende Nachricht wird verarbeitet, je nach Beginn der Nachricht.
     * Es wird immer der Bafehl und die Nachricht durch ein ":" getrennt, um diese zu trennen.
     * @param pClientIP
     * @param pClientPort
     * @param pMessage 
     */
    @Override
    public void processMessage(String pClientIP, int pClientPort, String pMessage)
    {
        boolean fallEins = false;
        boolean fallZwei = false;
        User pAUser = null;
        if(!user.isEmpty())
        {
            for(int i=0; i< user.size(); i++)
            {
                if(user.get(i).getIp().equals(pClientIP)&&user.get(i).getPort()==pClientPort)
                {
                    pAUser = user.get(i);
                }
            }
        }
        if(pAUser != null)
        {
            int a = pMessage.indexOf(':');
            if(a!= -1)
            {
                System.out.println(pMessage.substring(0, a));
                if(pMessage.substring(0, a).equals("Feld makieren"))    // Das uebergebene Feld wird, wenn moeglich, makiert.      
                {
                    String pName = pAUser.getName();
                    String pMFeld = "";
                    
                    String pGegnerName = pAUser.getGegnerName();
                    User pUser = null;
                    for(int i = 0; i< user.size();i++)
                    {
                        if(user.get(i).getName().equals(pGegnerName))
                        {
                            pUser = user.get(i);
                        }
                    }
                    if(pUser != null)
                        {
                            if(!pName.equals(""))
                            {
                                pMFeld = pAUser.getFeld().feldMakieren(pMessage.substring(a+2, pMessage.length()), pName);
                            }
                            if(!pMFeld.equals(""))
                            {
                                psend(pClientIP,pClientPort, "Das Feld wurde erfolgreich makiert: " + pMFeld);
                                
                                String gewinner = pAUser.getFeld().gewinnerErmitteln();

                                if(!gewinner.equals(""))
                                {
                                    if(gewinner.equals("Unentschieden"))
                                    {
                                        psend(pClientIP, pClientPort, "Unentschieden");
                                        psend(pAUser.getGegnerIP(), pAUser.getGegnerPort(),"Unentschieden");
                                    }
                                    else
                                    {
                                        psend(pClientIP, pClientPort, "Folgender Spieler hat gewonnen: " + gewinner );
                                        psend(pAUser.getGegnerIP(), pAUser.getGegnerPort(), "Folgender Spieler hat gewonnen: " + gewinner);
                                    }
                                    
                                    pAUser.setGegnerName("");
                                    pAUser.setGegnerIP("");
                                    pAUser.setGegnerPort(0);
                                    pAUser.setStatusImSpiel(false);

                                    pUser.setGegnerName("");
                                    pUser.setGegnerIP("");
                                    pUser.setGegnerPort(0);
                                    pUser.setStatusImSpiel(false);

                                    pAUser.getFeld().felderZuruecksetzen();
                                    pUser.setFeld(null);
                                    pAUser.setFeld(null);
                                }
                                else
                                {
                                    psend(pAUser.getGegnerIP(),pAUser.getGegnerPort(), "Du bist dran: " + pMFeld);
                                }
                            }
                    }
                    else
                    {
                        psend(pClientIP,pClientPort, "Feldmakierung fehlgeschlagen");
                    }
                }
                else if(pMessage.substring(0,a).equals("Spiel annehmen"))   // Die Herausforderung wird angenommen und das Spiel wird gestartet.
                {
                    String pName = pMessage.substring(a+2, pMessage.length());
                    User pUser = null;
                    for(int i = 0; i< user.size();i++)
                    {
                        if(user.get(i).getName().equals(pName))
                        {
                            pUser = user.get(i);
                        }
                    }
                    if(pUser != null)
                    {
                        Felder pFeld = new Felder();
                        pFeld.felderErstellen();

                        pAUser.setGegnerName(pName);
                        pAUser.setGegnerIP(pUser.getIp());
                        pAUser.setGegnerPort(pUser.getPort());
                        pAUser.setStatusImSpiel(true);
                        pAUser.setFeld(pFeld);

                        pUser.setGegnerName(pAUser.getName());
                        pUser.setGegnerIP(pAUser.getIp());
                        pUser.setGegnerPort(pAUser.getPort());
                        pUser.setStatusImSpiel(true);
                        pUser.setFeld(pFeld);

                        psend(pClientIP,pClientPort,"Du fängst an");
                        psend(pUser.getIp(), pUser.getPort(),"Das Spiel startet");
                    }
                    else
                    {
                        psend(pClientIP,pClientPort,"Spieler nicht online");
                    }
                }
                else if(pMessage.substring(0,a).equals("Spieler herausfordern"))    // Der angegebene Spieler wird zu einem Duell herausgefordert.
                {
                    String pName = pMessage.substring(a+2, pMessage.length());
                    User pUser = null;
                    System.out.println(pName);
                    String pA = "";
                    for(int i = 0; i< user.size();i++)
                    {
                        if(user.get(i).getName().equals(pName))
                        {
                            pUser = user.get(i);
                        }
                        pA = user.get(i).getName();
                    }
                    if(pUser != null)
                    {
                        if(pUser.getStatusImSpiel()==false)
                        {
                            psend(pUser.getIp(),pUser.getPort(), "folgender Spieler fordert dich heraus: "+pAUser.getName());
                            psend(pClientIP,pClientPort,"Spieler wurde herausgefordert");
                            server.protokoll("Spieler "+pName+" wurde von "+pAUser.getName()+" herausgefordert");
                        }
                        else
                        {
                            psend(pClientIP,pClientPort,"Spieler ist nicht verfügbar");
                        }
                    }
                    else
                    {
                        psend(pClientIP,pClientPort,"Spieler ist nicht online");
                    }
                }    
            }
            else if(pMessage.equals("Autozuweisung"))   // Der Spieler wird in die Warteschlange eingeordnet oder schon dirtekt einem Spieler zugewiesen und das Spiel gestartet.
            {
                if(warteschlange.isEmpty())
                {
                    warteschlange.add(pAUser);
                    psend(pClientIP,pClientPort,"Sie befinden sich in der Warteschlange");
                    server.protokoll("Spieler "+ pAUser.getName() +" wird nun automatisch zugewiesen.");
                }
                else
                {
                    User pUser = warteschlange.get(0);
                    warteschlange.remove(0);
                    if(pUser != null)
                    {
                        Felder pFeld = new Felder();
                        pFeld.felderErstellen();

                        pUser.setGegnerName(pAUser.getName());
                        pUser.setGegnerIP(pClientIP);
                        pUser.setGegnerPort(pClientPort);
                        pUser.setStatusImSpiel(true);
                        pUser.setFeld(pFeld);

                        pAUser.setGegnerName(pUser.getName());
                        pAUser.setGegnerIP(pUser.getIp());
                        pAUser.setGegnerPort(pUser.getPort());
                        pAUser.setStatusImSpiel(true);
                        pAUser.setFeld(pFeld);

                        psend(pClientIP,pClientPort,"Das Spiel startet");
                        psend(pUser.getIp(),pUser.getPort(),"Du fängst an");
                    }
                    else
                    {
                        warteschlange.add(pAUser);
                        psend(pClientIP,pClientPort,"Sie befinden sich in der Warteschlange");
                        server.protokoll("Spieler "+ pAUser.getName() +" wird nun automatisch zugewiesen.");
                    }
                }
            }
            else if(pMessage.equals("Autozuweisung abbrechen")) // Die Autozuweisung wird abgebrochen.
            {
                boolean fertig = false;
                for(int i =0;i<warteschlange.size();i++)
                {
                    if(warteschlange.get(i)==pAUser)
                    {
                        warteschlange.remove(i);
                        psend(pClientIP,pClientPort,"Sie wurden aus der Warteschlange herausgenommen");
                        server.protokoll(pAUser.getName() + " wurde von der Warteschlange gelöscht");
                        fertig = true;
                    }
                }
                if(fertig == false)
                {
                    psend(pClientIP,pClientPort,"Abbruch fehlgeschlagen");
                }
                else psend(pClientIP,pClientPort,"erfolgreich abgebrochen");
            }
            else if(pMessage.equals("Spiel beenden"))   // Das aktuelle Spiel wird beendet.
            {
                String pName = pAUser.getGegnerName();
                User pUser = null;
                for(int i = 0; i< user.size();i++)
                {
                    if(user.get(i).getName().equals(pName))
                    {
                        pUser = user.get(i);
                    }
                }
                if(pUser != null)
                {
                    pAUser.setGegnerName("");
                    pAUser.setGegnerIP("");
                    pAUser.setGegnerPort(0);
                    pAUser.setStatusImSpiel(false);
                    pAUser.setFeld(null);

                    pUser.setGegnerName("");
                    pUser.setGegnerIP("");
                    pUser.setGegnerPort(0);
                    pUser.setStatusImSpiel(false);
                    pUser.setFeld(null);

                    psend(pClientIP,pClientPort,"Du hast das Spiel verlassen");
                    psend(pUser.getIp(), pUser.getPort(),pAUser.getName() + "hat das Spiel verlassen");
                }
                else
                {
                    psend(pClientIP,pClientPort,"Gegner ist nicht mehr online");

                    pAUser.setGegnerName("");
                    pAUser.setGegnerIP("");
                    pAUser.setGegnerPort(0);
                    pAUser.setStatusImSpiel(false);
                    pAUser.setFeld(null);
                } 
            }
            else 
            {
                fallEins = true;    // Falls keine der ersten Abfragen zutreffen, wird der fallEins gleich true gestzt.
            } 
        }
        int a = pMessage.indexOf(':');
        if(a!=-1)
        {
            if(pMessage.substring(0, a).equals("Login"))    // Der Spieler wird unter angegebenen Namen angemeldet.
            {
                String pName = pMessage.substring(a+2, pMessage.length());
                User pUser = new User(pName);
                pUser.setIp(pClientIP);
                pUser.setPort(pClientPort);
                pUser.anmelden();
                user.add(pUser);
                psend( pClientIP, pClientPort, "erfolgreich angemeldet");
                server.protokoll(pName+": Login");
                server.protokoll("Server:"+pName+" erfolgreich angemeldet");

            }
            else if(pMessage.substring(0, a).equals("Logout"))  // Der Spieler wird ausgeloggt.
            {
                String pName = pMessage.substring(a+2, pMessage.length());
                System.out.println(pMessage.substring(a+2, pMessage.length()));
                int b=0;
                for(int i = 0; i < user.size(); i++)
                {
                    if(user.get(i).getName().equals(pName))
                    {
                        user.remove(i);
                        b=1;
                    }
                }
                if(b==1)
                {
                    psend(pClientIP, pClientPort, "erfolgreich abgemeldet");
                    server.protokoll(pName+ " wurde erfolgreich abgemeldet");
                }
                else psend(pClientIP, pClientPort, "Abmeldung fehlgeschlagen");
            }
        }
        else if(pMessage.equals("Aktualisieren"))   // Es werden von allen Spielern die Namen gesendet
        {
            String pText = "";
            for(int i=0; i< user.size(); i++)
            {
                pText = pText + user.get(i).getName() + " " ;
            }
            psend(pClientIP, pClientPort,"Spielerliste: "+ pText);
        }
        else 
        {
            fallZwei = true;    // Falls keine der zweiten Abfragen zutreffen, wird der FallZwei gleich true gesetzt
        }
        if(fallEins == true && fallZwei == true)    // Wenn FallEins und FallZwei gleich true wird gesendet, dass die Eingabe fehlerhaft ist.
        {
            psend(pClientIP,pClientPort,"Eingabe falsch oder nicht registriert");
        }
    }   

    /**
     * Die Verbindung zum Client wird beendet.
     * @param pClientIP
     * @param pClientPort 
     */
    @Override
    public void closeConnection(String pClientIP, int pClientPort)
    {
        System.out.println("Verbindung abgebrochen");
    }
    /**
     * Eine neue Verbindung zum Client wird hergestellt.
     * @param pClientIP
     * @param pClientPort 
     */
    public void newConnection(String pClientIP, int pClientPort)
    {
        System.out.println("Verbindung");
        this.psend(pClientIP, pClientPort, "Verbindung hergestellt");
    }
    /**
     * Die Nachricht wird an den Client gesendet.
     * @param pClientIP
     * @param pClientPort
     * @param pMessage 
     */
    public void psend(String pClientIP, int pClientPort, String pMessage)
    {
        send(pClientIP, pClientPort, pMessage);
    }
    /**
     * Die Nachricht wird an alle Clients gesendet.
     * @param pMessage 
     */
    @Override
    public void sendToAll(String pMessage)
    {
        for(int i=0;i<user.size();i++)
        {
            if(user.get(i).getStatus()==true)
            {
                this.psend(user.get(i).getIp(),9191,pMessage);
            }
        }
    }
    /**
     * Der Server wird geschlossen.0
     */
    @Override
    public void close()
    {
        
    }
}
